From 76cf3d95f6f5daf4f3f0663f3718ce7cb2198b19 Mon Sep 17 00:00:00 2001 From: Owen Taylor Date: Sun, 3 Mar 2002 02:52:56 +0000 Subject: [PATCH] Handle NO_WINDOW widgets with windows that are children of widget->window. Sat Mar 2 20:58:30 2002 Owen Taylor * gtk/gtkwidget.c (gtk_widget_reparent): Handle NO_WINDOW widgets with windows that are children of widget->window. (#50279) * tests/testgtk.c: Add eventboxes to the example so that we are reparenting between different GdkWindows. --- ChangeLog | 6 +++++ ChangeLog.pre-2-0 | 6 +++++ ChangeLog.pre-2-10 | 6 +++++ ChangeLog.pre-2-2 | 6 +++++ ChangeLog.pre-2-4 | 6 +++++ ChangeLog.pre-2-6 | 6 +++++ ChangeLog.pre-2-8 | 6 +++++ gtk/gtkwidget.c | 61 +++++++++++++++++++++++++++++----------------- tests/testgtk.c | 24 ++++++++++++------ 9 files changed, 97 insertions(+), 30 deletions(-) diff --git a/ChangeLog b/ChangeLog index cfd214a9cf..9f113fade3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Sat Mar 2 20:58:30 2002 Owen Taylor + + * gtk/gtkwidget.c (gtk_widget_reparent): Handle NO_WINDOW + widgets with windows that are children of widget->window. + (#50279) + Sat Mar 2 20:39:38 2002 Owen Taylor * gtk/gtkimagemenuitem.c (gtk_image_menu_item_new_from_stock): diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0 index cfd214a9cf..9f113fade3 100644 --- a/ChangeLog.pre-2-0 +++ b/ChangeLog.pre-2-0 @@ -1,3 +1,9 @@ +Sat Mar 2 20:58:30 2002 Owen Taylor + + * gtk/gtkwidget.c (gtk_widget_reparent): Handle NO_WINDOW + widgets with windows that are children of widget->window. + (#50279) + Sat Mar 2 20:39:38 2002 Owen Taylor * gtk/gtkimagemenuitem.c (gtk_image_menu_item_new_from_stock): diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index cfd214a9cf..9f113fade3 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,9 @@ +Sat Mar 2 20:58:30 2002 Owen Taylor + + * gtk/gtkwidget.c (gtk_widget_reparent): Handle NO_WINDOW + widgets with windows that are children of widget->window. + (#50279) + Sat Mar 2 20:39:38 2002 Owen Taylor * gtk/gtkimagemenuitem.c (gtk_image_menu_item_new_from_stock): diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index cfd214a9cf..9f113fade3 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,9 @@ +Sat Mar 2 20:58:30 2002 Owen Taylor + + * gtk/gtkwidget.c (gtk_widget_reparent): Handle NO_WINDOW + widgets with windows that are children of widget->window. + (#50279) + Sat Mar 2 20:39:38 2002 Owen Taylor * gtk/gtkimagemenuitem.c (gtk_image_menu_item_new_from_stock): diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index cfd214a9cf..9f113fade3 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,9 @@ +Sat Mar 2 20:58:30 2002 Owen Taylor + + * gtk/gtkwidget.c (gtk_widget_reparent): Handle NO_WINDOW + widgets with windows that are children of widget->window. + (#50279) + Sat Mar 2 20:39:38 2002 Owen Taylor * gtk/gtkimagemenuitem.c (gtk_image_menu_item_new_from_stock): diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index cfd214a9cf..9f113fade3 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,9 @@ +Sat Mar 2 20:58:30 2002 Owen Taylor + + * gtk/gtkwidget.c (gtk_widget_reparent): Handle NO_WINDOW + widgets with windows that are children of widget->window. + (#50279) + Sat Mar 2 20:39:38 2002 Owen Taylor * gtk/gtkimagemenuitem.c (gtk_image_menu_item_new_from_stock): diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index cfd214a9cf..9f113fade3 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,9 @@ +Sat Mar 2 20:58:30 2002 Owen Taylor + + * gtk/gtkwidget.c (gtk_widget_reparent): Handle NO_WINDOW + widgets with windows that are children of widget->window. + (#50279) + Sat Mar 2 20:39:38 2002 Owen Taylor * gtk/gtkimagemenuitem.c (gtk_image_menu_item_new_from_stock): diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index 3c7369b529..0c1587fd7c 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -196,8 +196,6 @@ static gboolean gtk_widget_real_focus_out_event (GtkWidget *widget, static gboolean gtk_widget_real_focus (GtkWidget *widget, GtkDirectionType direction); static PangoContext* gtk_widget_peek_pango_context (GtkWidget *widget); -static void gtk_widget_reparent_container_child (GtkWidget *widget, - gpointer client_data); static void gtk_widget_propagate_state (GtkWidget *widget, GtkStateData *data); static void gtk_widget_reset_rc_style (GtkWidget *widget); @@ -3146,37 +3144,53 @@ gtk_widget_set_scroll_adjustments (GtkWidget *widget, return FALSE; } -/***************************************** - * gtk_widget_reparent_container_child: - * assistent function to gtk_widget_reparent - * - * arguments: - * - * results: - *****************************************/ +static void +gtk_widget_reparent_subwindows (GtkWidget *widget, + GdkWindow *new_window) +{ + if (GTK_WIDGET_NO_WINDOW (widget)) + { + GList *children = gdk_window_get_children (widget->window); + GList *tmp_list; + + for (tmp_list = children; tmp_list; tmp_list = tmp_list->next) + { + GtkWidget *child; + GdkWindow *window = tmp_list->data; + + gdk_window_get_user_data (window, (void **)&child); + while (child && child != widget) + child = child->parent; + + if (child) + gdk_window_reparent (window, new_window, 0, 0); + } + + g_list_free (children); + } + else + gdk_window_reparent (widget->window, new_window, 0, 0); +} static void -gtk_widget_reparent_container_child (GtkWidget *widget, - gpointer client_data) +gtk_widget_reparent_fixup_child (GtkWidget *widget, + gpointer client_data) { g_return_if_fail (client_data != NULL); if (GTK_WIDGET_NO_WINDOW (widget)) { if (widget->window) - gdk_window_unref (widget->window); + gdk_window_unref (widget->window); widget->window = (GdkWindow*) client_data; if (widget->window) - gdk_window_ref (widget->window); + gdk_window_ref (widget->window); if (GTK_IS_CONTAINER (widget)) - gtk_container_forall (GTK_CONTAINER (widget), - gtk_widget_reparent_container_child, - client_data); + gtk_container_forall (GTK_CONTAINER (widget), + gtk_widget_reparent_fixup_child, + client_data); } - else - gdk_window_reparent (widget->window, - (GdkWindow*) client_data, 0, 0); } /** @@ -3213,9 +3227,10 @@ gtk_widget_reparent (GtkWidget *widget, if (GTK_WIDGET_IN_REPARENT (widget)) { GTK_PRIVATE_UNSET_FLAG (widget, GTK_IN_REPARENT); - - gtk_widget_reparent_container_child (widget, - gtk_widget_get_parent_window (widget)); + + gtk_widget_reparent_subwindows (widget, gtk_widget_get_parent_window (widget)); + gtk_widget_reparent_fixup_child (widget, + gtk_widget_get_parent_window (widget)); } g_object_notify (G_OBJECT (widget), "parent"); diff --git a/tests/testgtk.c b/tests/testgtk.c index 6516e2fe21..888860f10e 100644 --- a/tests/testgtk.c +++ b/tests/testgtk.c @@ -2469,6 +2469,7 @@ create_reparent (void) GtkWidget *button; GtkWidget *label; GtkWidget *separator; + GtkWidget *event_box; if (!window) { @@ -2498,18 +2499,23 @@ create_reparent (void) gtk_container_add (GTK_CONTAINER (frame), box3); button = gtk_button_new_with_label ("switch"); - gtk_signal_connect (GTK_OBJECT (button), "clicked", - GTK_SIGNAL_FUNC(reparent_label), - box3); gtk_object_set_user_data (GTK_OBJECT (button), label); gtk_box_pack_start (GTK_BOX (box3), button, FALSE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (box3), label, FALSE, TRUE, 0); + event_box = gtk_event_box_new (); + gtk_box_pack_start (GTK_BOX (box3), event_box, FALSE, TRUE, 0); + gtk_container_add (GTK_CONTAINER (event_box), label); + + gtk_signal_connect (GTK_OBJECT (button), "clicked", + GTK_SIGNAL_FUNC(reparent_label), + event_box); + gtk_signal_connect (GTK_OBJECT (label), "parent_set", GTK_SIGNAL_FUNC (set_parent_signal), GINT_TO_POINTER (42)); + frame = gtk_frame_new ("Frame 2"); gtk_box_pack_start (GTK_BOX (box2), frame, TRUE, TRUE, 0); @@ -2518,11 +2524,15 @@ create_reparent (void) gtk_container_add (GTK_CONTAINER (frame), box3); button = gtk_button_new_with_label ("switch"); - gtk_signal_connect (GTK_OBJECT (button), "clicked", - GTK_SIGNAL_FUNC(reparent_label), - box3); gtk_object_set_user_data (GTK_OBJECT (button), label); gtk_box_pack_start (GTK_BOX (box3), button, FALSE, TRUE, 0); + + event_box = gtk_event_box_new (); + gtk_box_pack_start (GTK_BOX (box3), event_box, FALSE, TRUE, 0); + + gtk_signal_connect (GTK_OBJECT (button), "clicked", + GTK_SIGNAL_FUNC(reparent_label), + event_box); separator = gtk_hseparator_new (); gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0); -- 2.30.2